Skip to content
Sander Vos
Projects

Ledger

A plain-text personal finance tool with no accounts, no sync, and no opinions.

Source on GitHub

A stack of plain index cards seen edge on, slightly fanned
Year
2025
Status
Maintained
Role
Author
Built with
Go, SQLite, plain text

Ledger reads a text file and tells you where the money went. It does not connect to a bank, does not run a server, and does not know your name. About nine hundred people use it, which for a tool with no marketing and a text-file interface feels like a lot.

Why plain text

Because the file outlives the program. Everything I have used for this in the last decade has either shut down, been acquired, or changed its export format, and in each case the thing that survived was whatever I had already written down in a form a human could read.

2026-08-04  groceries      -42.10  EUR
2026-08-04  coffee          -3.60  EUR
2026-08-05  invoice #118  2400.00  EUR

That is the whole format. Three columns and a date. Anything more expressive turned out to be a category system in disguise, and category systems are personal enough that shipping one is a small act of aggression.

The one clever thing

Ledger keeps a SQLite index beside the file and rebuilds it when the file changes. Queries are instant on a decade of history, and if the index is deleted nothing is lost. Every piece of state that is not the text file is a cache, and the program is allowed to throw a cache away.

What I would change

The command names. I chose them in an evening and they are inconsistent in a way that is now impossible to fix without breaking nine hundred people's shell aliases.